import * as vscode from "vscode";
import * as path from "path";
import { VsCodeUtil } from "@/utils/VsCodeUtil";

/**
 * @description 创建.view.xml文件，并自动在Dorado视图编辑器中打开
 * @author hans
 * @date 2025/4/23
 */
export class DoradoViewCreator {
    /**
     * 创建视图文件
     * @param uri 选中的文件夹Uri
     */
    public async createViewFile(uri: vscode.Uri): Promise<void> {
        try {
            const targetFolder = await this.getTargetFolder(uri);
            let fileName = await this.promptForFileName();

            if (!fileName) {
                return; // 用户取消输入
            }
            if (!fileName.endsWith('.view.xml')) {
                fileName = fileName + '.view.xml';
            }
            const filePath = vscode.Uri.file(path.join(targetFolder, fileName));
            await this.writeViewFile(filePath);

            // 在Dorado视图编辑器中打开新创建的文件
            vscode.commands.executeCommand('extension.openWithDoradoAction', filePath);

            // 显示状态栏消息
            VsCodeUtil.showStatusMessage(
                `成功创建文件: ${fileName}`,
                3000,
                'revealFileInOS',
                "点击在资源管理器中显示文件"
            );

        } catch (error) {
            this.handleError(error);
        }
    }

    /**
     * 获取目标文件夹路径
     */
    private async getTargetFolder(uri: vscode.Uri): Promise<string> {
        const targetFolder = uri?.fsPath || vscode.workspace.workspaceFolders?.[0].uri.fsPath;
        if (!targetFolder) {
            throw new Error('未选择目标文件夹，请在资源管理器中右键选择一个文件夹');
        }
        return targetFolder;
    }

    /**
     * 提示用户输入文件名
     */
    private async promptForFileName(): Promise<string | undefined> {
        return vscode.window.showInputBox({
            prompt: '请输入视图文件名称',
            placeHolder: 'example.view.xml',
            validateInput: (value: string) => {
                if (!value) {
                    return '文件名不能为空';
                }
                // 移除.view.xml后缀进行验证
                const className = value.replace(/\.view\.xml$/, '');
                // 验证是否是合法的Java类名
                if (!/^[a-zA-Z0-9]*$/.test(className)) {
                    return '文件名不符合规范（只能包含字母和数字）';
                }
                return null;
            }
        });
    }

    /**
     * 写入视图文件内容到本地磁盘
     */
    private async writeViewFile(filePath: vscode.Uri): Promise<void> {
        const defaultContent =
            `<?xml version="1.0" encoding="UTF-8"?>
                <ViewConfig>
                <Arguments/>
                <Context/>
                <Model/>
                <View/>
                </ViewConfig>
            `;

        await vscode.workspace.fs.writeFile(
            filePath,
            Buffer.from(defaultContent, 'utf-8')
        );
    }

    /**
     * 处理错误
     */
    private handleError(error: unknown): void {
        const errorMessage = error instanceof Error ? error.message : String(error);
        vscode.window.showErrorMessage(`创建文件失败: ${errorMessage}`);
        console.error('创建.view.xml文件失败:', error);
    }
}
